<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>详解函数执行阶段</title>
</head>
<body>
    <script>


        // 内存  


        //  栈内存
        // 基本数据类型 
        // 函数名在 栈内存 


        //  堆内存
        // 复杂数据类型   引用数据类型 

        // 函数体 在堆内存  


        // var test = function(num){
        //     alert(num);
        // }


        // var haha = test;
        // haha(100);
        // 需要熟练记忆

        // 函数定义阶段 
        // 1-1  现在堆内存中开辟空间
        // 1-2 把函数体内的代码 原样复制到空间内(我们写代码写在硬盘上)
        // 1-3 把内存的地址 赋值给栈内存的函数名   


        //函数调用阶段
        // 2-1 按照函数名存的地址去找到对应的函数体  
            // 先判断栈内存中是否有这个变量
            // 如果存在 也会判断里边是否存储的还一个函数体
        // 2-2  在调用栈 内开辟一个新的 函数执行空间  (一个函数可以被多次调用为了避免一个调用出现的结果影响所有的调用
        //所以每次的调用都会申请一个执行空间)
        // 2-3 在执行空间内 给形参赋值  
        // 2-4 在执行空间内 对函数体内的代码进行预解析 
        // 2-5 在执行空间内 对函数体内的代码 执行一遍
        // 2-6 完成以后 这个执行空间被销毁 或者理解为空间被收回 




        var num = 100;
        function fn(){
            console.log(num);
        }

        num = 200;
        fn();
        




    </script>
</body>
</html>